#include "disparar.h"

Disparar::Disparar(Tam dim,const Matriz* pos)
{
	Indice i,j;
	_dimension = dim;
	_hilbert = new Matriz(_dimension,_dimension);
	for(i=1;i<=_dimension;i++)
		for(j=1;j<=_dimension;j++)
		{
			_hilbert->set(i,j,double(1.00/(i+j-1)));
            /*if(i==j)
                _hilbert->set(i,j,1.00);
            else
                _hilbert->set(i,j,0.00);*/
		}

	_auxiliar = new Matriz(_dimension,1);

	double valor;
	for(i=1;i<=_dimension;i++)
	{
		valor=0;
		for(j=1;j<=_dimension;j++)
			valor+=_hilbert->get(i,j) * pos->get(j,1);
		_auxiliar->set(i,1,valor);
	}
}

//devuelve la transformacion en la matriz trans
void Disparar::getTransformacion(const Matriz* ene,Matriz* trans)
{
	Indice i,j;
	vector<double> diagonal(_dimension);
	for(i=1;i<=_dimension;i++)
	{
		if(ene->get(i,1) <= 1e-6 || _auxiliar->get(i,1) <= 1e-6)
			diagonal[i-1] = 0.0001;
		else
			//diagonal[i] = _auxiliar->get(i,1) / ene->get(i,1);
			diagonal[i-1] = ene->get(i,1) / _auxiliar->get(i,1);
	}

	for(i=1;i<=_dimension;i++)
		for(j=1;j<=_dimension;j++)
			trans->set(i,j,diagonal[i-1] * _hilbert->get(i,j));
}

void Disparar::getPrimerDisparo(Matriz* disparo)
{
	disparo->copiarMatriz(_auxiliar);
}

void Disparar::getPrimerTransformacion(Matriz* trans)
{
	trans->copiarMatriz(_hilbert);
}

Disparar::~Disparar()
{
	if(!_hilbert)
		delete _hilbert;
	if(!_auxiliar)
		delete _auxiliar;
}
